/* 
条件分发的继续使用

内置类型， 转化类型
1. 部分可选 
-- 内置类型 Partial  , 将属性变为可选属性
2. 可选变必选
-- 内置类型 Required
3. 只读
-- Readonly
4. 挑选, 从对象的众多属性里挑出想要的,可以多个,其余的抛弃
-- Pick
5. 记录
-- Record


 extends 表示约束，必须遵守某种规则

 关于遍历： 
 -- 从对象中取属性用 keyof , 
 -- 从了联合类型中取类型用 in , 此时只能作为对象的属性索引


*/
//-------------将所有属性变为可选属性-------------------------
interface Person {
    name: string,
    age: number,
    company: string
}
// ---------Partial 原理------
type Partial<T> = {
    [K in keyof T]?: T[K]  //  key---value
}
//-----------Partial原理------
type MyPerson = Partial<Person>  // 属性都变为可选了
let p: MyPerson = {
    name: 'zs'
}
//-------------将所有属性变为可选属性-------------------------

//-------------深度可选 原理-----------------
type DeepPartial<T> = { [K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K] }
//-------------深度可选------------------


//-------------将可选属性变必选-------------------
type Required<T> = { [K in keyof T]-?: T[K] } // -? 表示必选
type MyPp = Required<MyPerson>

//-------------属性变只读-------------------
type Readonly<T> = { readonly [K in keyof T]: T[K] } // 只读
type MyP2 = Readonly<MyPerson>
//--------------------------------

//-------------挑选---------------
type Pick<T, K extends keyof T> = { [P in K]: T[P] } // 挑选原理
type PersonPick = Pick<Person, 'name' | 'age'>
//--------------------------------

//-----------------------------------
// type Record<K extends keyof any, T> = { [P in K]: T; } // 与下行相同
type Record<K extends string | number | symbol, T> = { [P in K]: T; } // Record原理

// oo 无法取属性
let oo: Record<string, any> = { name: "zs", age: 12 }


//-----------------------------------


export { }